﻿#pragma once

//加解密C3C4开头的socket数据
class MuEncDec
{
	unsigned int encBaseDat[64];
	unsigned int decBaseDat[64];

public:
	MuEncDec();
	~MuEncDec();

	static void Xor3Byte_fccfab(unsigned char *pData, int nLen);

	//客户端使用enc1.dat，服务端使用enc2.dat
	bool ReadEnc_dat(const char *fileName);

	//客户端使用Dec2.dat，服务端使用Dec1.dat
	bool ReadDec_dat(const char *fileName);

	//sub_46a370 pBuf==0时返回buf需求长度,实际解码时可能小于此值
	//待解密的数据和返回的数据都不包含c3c4头和长度字段
	int DecodeC3C4(unsigned char *pBuf, unsigned char *pByts, int bytsLen);

	//sub_46a300 pBuf==0时返回buf需求长度
	//待加密的数据和返回的数据都不包含c3c4头和长度字段
	int EncodeC3C4(unsigned char *pBuf, unsigned char *pByts, int bytsLen);

private:
	void XorDatFile(FILE *fp, unsigned int *pBuf);

	bool ReadDatFile(const char *fileName, int fileTag, int f0, int f1, int f2, int f3, unsigned int *pBuf);

	//sub_46a860
	int ShiftRight3(int i);

	//sub_46a7c0
	void ShiftBytes(unsigned char *pBuf, unsigned int count, int nBit);

	int sub_46a680(unsigned char *pBuf, int x, unsigned int *pData, int n1, int n2);

	//sub_46A3F0
	//c3c4加密32字节to38字节
	//outBuf: 返回加密后数据，调用者分配空间38字节
	//inData: 要加密的数据，没有32也要补足32字节
	//realDataLen: 数据实际长度
	void Encode32to38(unsigned char *outBuf, unsigned char *inData, int realDataLen);

	//sub_46A510
	//c3c4解密38字节to32字节
	int Decode38to32(unsigned char *outBuf, unsigned char *inData);
};
